package com.wwu.common.swagger;

import com.github.xiaoymin.swaggerbootstrapui.annotations.EnableSwaggerBootstrapUI;
import io.swagger.annotations.ApiOperation;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import springfox.documentation.builders.ApiInfoBuilder;
import springfox.documentation.builders.PathSelectors;
import springfox.documentation.builders.RequestHandlerSelectors;
import springfox.documentation.service.*;
import springfox.documentation.spi.DocumentationType;
import springfox.documentation.spring.web.plugins.Docket;
import springfox.documentation.swagger2.annotations.EnableSwagger2;

/**
 * Swagger2配置类
 * 启用Swagger-Bootstrap-UI增强功能
 * @author 一蓑烟雨
 * @CreateTime 2021-10-28 16:57
 * @Version 1.0.0
 **/
@Configuration
@EnableSwagger2
@EnableSwaggerBootstrapUI
public class Swagger2Config {
    /** 是否启用swagger */
    @Value("${swagger.basic.enable}")
    private  Boolean swaggerEnable;

    /**
     * 1-首页分组API
     * @author 一蓑烟雨
     * @date 2021/10/28 0028 下午 19:15
     */
    @Bean
    public Docket apiDocket(){
        return new Docket(DocumentationType.SWAGGER_2)
                //设置Api文档头信息
                .apiInfo(apiInfo(SwaggerConst.SWAGGER_TAGS_HOME))
                //是否启用Api文档
                .enable(swaggerEnable)
                .select()
                //扫描com.wwu.system.controller包下使用ApiOperation注解的方法
                .apis(RequestHandlerSelectors.basePackage("com.wwu.system.controller"))
                .apis(RequestHandlerSelectors.withMethodAnnotation(ApiOperation.class))
                //ant表达式,匹配不以/system开头的请求路径
                .paths(PathSelectors.regex("^(?!/system).*$"))
                .build()
                .groupName(SwaggerConst.SWAGGER_TAGS_HOME);
    }

    /**
     *  2-系统基础功能分组API
     * @return: springfox.documentation.spring.web.plugins.Docket
     * @author 一蓑烟雨
     * @date 2022/5/18 0018 下午 21:13
     */
    @Bean
    public Docket systemApiDocket(){
        return new Docket(DocumentationType.SWAGGER_2)
                .apiInfo(apiInfo(SwaggerConst.SWAGGER_TAGS_BASE))
                .select()
                //扫描com.wwu.system.controller包下使用ApiOperation注解的方法
                .apis(RequestHandlerSelectors.basePackage("com.wwu.system.controller"))
                .apis(RequestHandlerSelectors.withMethodAnnotation(ApiOperation.class))
                //ant表达式,匹配/system下的所有请求路径
                .paths(PathSelectors.ant("/system/**"))
                .build()
                .groupName(SwaggerConst.SWAGGER_TAGS_BASE);
    }

    /**
     * 3-系统监控功能分组API
     * @return: springfox.documentation.spring.web.plugins.Docket
     * @author 一蓑烟雨
     * @date 2022/5/18 0018 下午 21:23
     */
    @Bean
    public Docket monitorApiDocket(){
        return new Docket(DocumentationType.SWAGGER_2)
                .apiInfo(apiInfo(SwaggerConst.SWAGGER_TAGS_MONI))
                .select()
                //扫描com.wwu.system.controller包下使用ApiOperation注解的方法
                .apis(RequestHandlerSelectors.basePackage("com.wwu.monitor.controller"))
                .apis(RequestHandlerSelectors.withMethodAnnotation(ApiOperation.class))
                //过滤路径
                .paths(PathSelectors.any())
                .build()
                .groupName(SwaggerConst.SWAGGER_TAGS_MONI);
    }

    /**
     * 创建该API文档头部信息,展现在接口文档中
     * 访问地址：http://项目实际地址/swagger-ui.html
     * @author 一蓑烟雨
     * @date 2021/10/28 0028 下午 19:17
     */
    private ApiInfo apiInfo(String titleSuffix) {
        return new ApiInfoBuilder()
                //页面标题
                .title("后台权限管理系统API接口文档--"+titleSuffix)
                //页面描述
                .description("<h2>基于SpringFox设计的API接口文档，本文档中的Api接口需要登陆后才能进行调试。</h2>" +
                        "<h3><font color=\"#FF0000\">请进入【首页】分组下进行登陆，授登陆流程如下：</font></h3>" +
                        "<p>" +
                        "<ul>" +
                        "<li>1.请求验证码：依次点击【用户登陆控制器】/【获取验证码】,选择“调试”后点击发送即可;</li>" +
                        "<li>2.输入验证码：依次点击【用户登陆控制器】/【用户登录】,选择“调试”后输入用户名、密码和验证码点击发送即可;</li>" +
                        "</ul>" +
                        "</p>")
                //版本号
                .version("1.0.0")
                .contact(new Contact("一蓑烟雨",null,"yisuoyanyu@sina.com"))
                .build();
    }
}
